using System;

namespace TianYuan.Core.Caching
{
    /// <summary>
    /// 表示由此特性所描述的方法，能够获得来自田园框架基础结构层所提供的缓存功能。
    /// </summary>
    [AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited=false)]
    public class CachingAttribute : Attribute
    {
        #region Ctor
        /// <summary>
        /// 初始化一个新的<see cref="CachingAttribute"/>类型。
        /// </summary>
        /// <param name="method">缓存方式<see cref="CachingMethod"/>。（Get、Put、Remove）</param>
        /// <param name="cacheSeconds">缓存时间。</param>
        /// <param name="cacheRegion">缓存名称，指定区域的缓存执行者实例，如果不设置，默认以返回类型的FullName作为参数</param>
        /// <param name="key">缓存键，如果不设置，默认按照方法的所有参数进行组合，支持四种表达式组合：methodname+#args+#args[0]+#query.Id</param>
        public CachingAttribute(CachingMethod method, int cacheSeconds,string cacheRegion= "", string key = "")
        {
            this.Method = method;
            CacheSeconds = cacheSeconds;
            this.CacheRegion = cacheRegion;
            this.Key = key;
        }
        /// <summary>
        /// 初始化一个新的<c>CachingAttribute</c>类型。
        /// </summary>
        /// <param name="method">缓存方式<see cref="CachingMethod"/>。（Get、Put、Remove）</param>
        /// <param name="cacheSeconds">缓存时间。</param>
        /// <param name="cacheRegion">缓存名称，指定区域的缓存执行者实例，如果不设置，默认以返回类型的FullName作为参数</param>
        /// <param name="key">缓存键，如果不设置，默认按照方法的所有参数进行组合，支持四种表达式组合：methodname+#args+#args[0]+query.Id</param>
        /// <param name="correspondingTypes">与当前缓存方式的类型相关。注：此参数仅在缓存方式为Remove时起作用。</param>
        public CachingAttribute(CachingMethod method, int cacheSeconds, string cacheRegion="", string key="", params Type[] correspondingTypes)
            : this(method, cacheSeconds)
        {
            this.Method = method;
            this.CorrespondingTypes = correspondingTypes;
            this.CacheRegion = cacheRegion;
            this.Key = key;
        }
        #endregion

        #region Public Properties

        /// <summary>
        /// 缓存名称，指定区域的缓存执行者实例，如果不设置，默认以返回类型的FullName作为参数
        /// </summary>
        public string CacheRegion { set; get; }

        /// <summary>
        /// 缓存键，如果不设置，默认按照方法的所有参数进行组合，支持四种表达式组合：methodname+#args+#args[0]+query.Id
        /// </summary>

        public string Key { set; get; }

        /// <summary>
        /// 缓存时间
        /// </summary>
        public int CacheSeconds { set; get; }
        /// <summary>
        /// 获取或设置缓存方式<see cref="CachingMethod"/>。
        /// </summary>
        public CachingMethod Method { get; set; }
        /// <summary>
        /// 获取或设置一个<see cref="Boolean"/>值，该值表示当缓存方式为Put时，是否强制将值写入缓存中。
        /// </summary>
        public bool Force { get; set; }
        /// <summary>
        /// 获取或设置与当前缓存方式相关的方法名称。注：此参数仅在缓存方式为Remove时起作用。
        /// </summary>
        public Type[] CorrespondingTypes { get; set; }
        #endregion
    }
}
